#ifndef EMBEDDEDJAVAVM_H
#define EMBEDDEDJAVAVM_H

// #include "JavaVmInitArg.h"

namespace Pan
{
    class JavaVmInitArg;
    class JvmDll;

    /**
     * @brief 可以嵌入到C++程序中的Java虚拟机, 可以运行Java代码
     */
    class EmbeddedJavaVM
    {

    protected:
        // 函数名称
        static constexpr const char *const JNI_CreateJavaVM_Name = "JNI_CreateJavaVM";

    public:
        /**
         * @brief 构造函数
         * @param jvm_dll jvm.dll句柄
         * @param arg 虚拟机参数
         */
        EmbeddedJavaVM(JvmDll &jvm_dll, JavaVmInitArg &arg);

        /**
		 * @brief 析构函数
		 */
    public:
        ~EmbeddedJavaVM();

    public:
        /**
		 * @brief 获取jvm.dll的路径(绝对路径)
		 * @param buffer 缓存区
		 * @param size 缓存区大小
		 */
        unsigned long get_jvm_dll_path(wchar_t *buffer, unsigned int size);

    protected:
        /**
         * @brief 在 jvm.dll 中加载函数 JNI_CreateJavaVM()
         * 在构造函数中会调用
         * @return 是否加载成功
         */
        bool init_JNI_CreateJavaVM(JvmDll &jvm_dll);

    protected:
        /**
		 * @brief 调用函数JNI_CreateJavaVM()创建jvm
         *  在构造函数中会调用
		 * @return 是否调用成功
		 */
        bool call_JNI_CreateJavaVM(JavaVmInitArg &init_arg);

    public:
        /**
		 * @brief 调用 java 的 main 函数
         * @param main_class 主类的路径
		 * @return 是否调用成功
		 */
        bool call_java_main(const char *main_class);

    protected:
        /**
		 * @brief 调用销毁虚拟机函数
		 * @return 是否调用成功
		 */
        bool call_DestroyJavaVM();

    protected:
        char main_class[64]; // 主类

    protected:
        void *JNI_CreateJavaVM; // jni启动函数地址
        void *jni_env;          // jni环境指针
        void *jvm;              // jvm指针
    };

}

#endif
